package com.app.util.db.tool;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.app.util.db.ResultSetUtil;
import com.app.util.db.bean.ResultList;

/**
 * 数据库工具类
 * 
 * @author yaoming
 */
public class DbUtil {

	/** 秒, 注意 mysql-connector-java-5.0.3-bin.jar 使用的毫秒 */
	int queryTimeout = 30;
 
	/**
	 * 查询
	 * 
	 * @param con
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public ResultList select(Connection con, String sql) throws SQLException {
		Statement sta = statement(con);
		ResultSet rs = null;
		try {
			rs = sta.executeQuery(sql);
			return ResultSetUtil.loadResultList(rs);
		} finally {
			if (rs != null) {
				rs.close();
			}
			sta.close();
		}
	}

	/**
	 * 查询
	 * 
	 * @param con
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public ResultList select(Connection con, String sql, Object[] params) throws SQLException {
		PreparedStatement pst = prepareStatement(con, sql);
		ResultSet rs = null;
		try {
			putValue(params, pst);
			rs = pst.executeQuery();
			return ResultSetUtil.loadResultList(rs);
		} finally {
			if (rs != null) {
				rs.close();
			}
			pst.close();
		}
	}

	/**
	 * 更新
	 * 
	 * @param con
	 * @param sql
	 * @return
	 * @throws SQLException
	 */
	public int update(Connection con, String sql) throws SQLException {
		Statement sta = statement(con);
		try {
			return sta.executeUpdate(sql);
		} finally {
			sta.close();
		}
	}

	/**
	 * 更新
	 * 
	 * @param con
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public int update(Connection con, String sql, Object[] params) throws SQLException {
		PreparedStatement pst = prepareStatement(con, sql);
		try {
			putValue(params, pst);
			return pst.executeUpdate();
		} finally {
			pst.close();
		}
	}

	private void putValue(Object[] params, PreparedStatement sta) throws SQLException {
		for (int i = 0; i < params.length; i++) {
			sta.setObject(i + 1, params[i]);
		}
	}

	private Statement statement(Connection con) throws SQLException {
		Statement sta = con.createStatement();
		sta.setQueryTimeout(queryTimeout);
		return sta;
	}

	private PreparedStatement prepareStatement(Connection con, String sql) throws SQLException {
		PreparedStatement pst = con.prepareStatement(sql);
		pst.setQueryTimeout(queryTimeout);
		return pst;
	}

	public int getQueryTimeout() {
		return queryTimeout;
	}

	public void setQueryTimeout(int queryTimeout) {
		this.queryTimeout = queryTimeout;
	}

	//
	// private String getSqlType(Object[] arr) throws SQLException {
	// if (arr instanceof String[] || (arr.length > 0 && arr[0] instanceof
	// String)) {
	// return "VARCHAR";
	// }
	// if (arr instanceof Character[] || (arr.length > 0 && (arr[0] instanceof
	// Character))) {
	// return "VARCHAR";
	// }
	// if (arr instanceof BigDecimal[] || (arr.length > 0 && (arr[0] instanceof
	// BigDecimal))) {
	// return "NUMERIC";
	// }
	// if (arr instanceof BigDecimal[] || (arr.length > 0 && (arr[0] instanceof
	// BigDecimal))) {
	// return "NUMERIC";
	// }
	// if (arr instanceof Boolean[] || (arr.length > 0 && (arr[0] instanceof
	// Boolean))) {
	// return "BIT";
	// }
	// if (arr instanceof Byte[] || (arr.length > 0 && (arr[0] instanceof
	// Byte))) {
	// return "TINYINT";
	// }
	// if (arr instanceof Short[] || (arr.length > 0 && (arr[0] instanceof
	// Short))) {
	// return "SMALLINT";
	// }
	// if (arr instanceof Integer[] || (arr.length > 0 && (arr[0] instanceof
	// Integer))) {
	// return "integer";
	// }
	// if (arr instanceof Long[] || (arr.length > 0 && (arr[0] instanceof
	// Long))) {
	// return "bigint";
	// }
	// if (arr instanceof Float[] || (arr.length > 0 && (arr[0] instanceof
	// Float))) {
	// return "REAL";
	// }
	// if (arr instanceof Double[] || (arr.length > 0 && (arr[0] instanceof
	// Double))) {
	// return "FLOAT";
	// }
	// if (arr instanceof Byte[] || (arr.length > 0 && (arr[0] instanceof
	// Byte))) {
	// return "BINARY";
	// }
	// if (arr instanceof Date[] || (arr.length > 0 && (arr[0] instanceof
	// Date))) {
	// return "DATE";
	// }
	// if (arr instanceof java.sql.Date[] || (arr.length > 0 && (arr[0]
	// instanceof java.sql.Date))) {
	// return "DATE";
	// }
	// if (arr instanceof java.sql.Time[] || (arr.length > 0 && (arr[0]
	// instanceof java.sql.Time))) {
	// return "TIME";
	// }
	// if (arr instanceof java.sql.Timestamp[] || (arr.length > 0 && (arr[0]
	// instanceof java.sql.Timestamp))) {
	// return "TIMESTAMP";
	// }
	// throw new SQLException("Unknow sql types: " + arr[0].getClass());
	// }

}
